{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 1\n",
    "\n",
    "Создайте numpy array с элементами от числа N до 0 (например, для N = 10 это будет array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0]))."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-15, -14, -13, -12, -11, -10,  -9,  -8,  -7,  -6,  -5,  -4,  -3,\n",
       "        -2,  -1,   0])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "N = -15\n",
    "gen_array_from_N_to_zero = lambda N: np.arange(N, -1, -1) if N >=0 else np.arange(N, 1, 1)\n",
    "gen_array_from_N_to_zero(N)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 2\n",
    "\n",
    "Создайте диагональную матрицу с элементами от N до 0. Посчитайте сумму ее значений на диагонали."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Сумма элементов главной диагонали (способ 1): 55\n",
      "Сумма элементов главной диагонали (способ 2): 55\n"
     ]
    }
   ],
   "source": [
    "N = 10\n",
    "diag_vektor = gen_array_from_N_to_zero(N)\n",
    "a = np.diag(diag_vektor)\n",
    "# Сумму значений можно посчитать сложив элементы diag_vektor\n",
    "print('Сумма элементов главной диагонали (способ 1):', diag_vektor.sum())\n",
    "# Можно найти из элементов матрицы\n",
    "print('Сумма элементов главной диагонали (способ 2):', sum([vektor[index] for index, vektor in enumerate(a)]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 3\n",
    "\n",
    "Решите систему уравнений:\n",
    "\n",
    "4x + 2y + z = 4\n",
    "\n",
    "x + 3y = 12\n",
    "\n",
    "5y + 4z = -3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x = 0.4666666666666668, y = 3.844444444444444, z = -5.555555555555555\n",
      "Проверка корректности результата: True\n"
     ]
    }
   ],
   "source": [
    "a = np.array([\n",
    "    [4,2,1],\n",
    "    [1,3,0],\n",
    "    [0,5,4]   \n",
    "])\n",
    "b = np.array([4,12,-3])\n",
    "r = np.linalg.solve(a, b)\n",
    "print('x = {}, y = {}, z = {}'.format(*r))\n",
    "print('Проверка корректности результата:', np.allclose(np.dot(a,r), b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Задание 4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Имеется матрица покупок в интернет-магазине. Столбец А - ID пользователя. Остальные столбцы - количество покупок категорий товаров этим пользователем.\n",
    "\n",
    "Матрица в виде numpy array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "users_stats = np.array(\n",
    "    [\n",
    "        [2, 1, 0, 0, 0, 0],\n",
    "        [1, 1, 2, 1, 0, 0],\n",
    "        [2, 0, 1, 0, 0, 0],\n",
    "        [1, 1, 2, 1, 0, 1],\n",
    "        [0, 0, 1, 2, 0, 0],\n",
    "        [0, 0, 0, 0, 0, 5],\n",
    "        [1, 0, 0, 0, 0, 0],\n",
    "        [0, 1, 1, 0, 0, 0],\n",
    "        [0, 0, 0, 1, 1, 3],\n",
    "        [1, 0, 0, 2, 1, 4]\n",
    "    ], \n",
    "    np.int32\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "На сайт заходит очередной посетитель, о покупках которого известно следующее:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "next_user_stats = np.array([0, 1, 2, 0, 0, 0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Найдите самого похожего пользователя. Т. е. посчитайте косинусное сходство между этим пользователем и всеми пользователями из массива user_stats"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Самый похожий пользователь: индекс 7, вектор [0 1 1 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "def vektor_cos(a, b):\n",
    "    \"\"\"\n",
    "    Подсчет косинуса угла между векторами a, b по их координатам\n",
    "    \"\"\"\n",
    "    norm_vektor_a = np.linalg.norm(a)\n",
    "    norm_vektor_b = np.linalg.norm(b)\n",
    "    return np.dot(a, b) / (norm_vektor_a * norm_vektor_b)\n",
    "\n",
    "cos_statistic = [(index_user, vektor_cos(current_user, next_user_stats)) \n",
    "                 for index_user, current_user in enumerate(users_stats)]\n",
    "similat_user_index = max(cos_statistic, key=lambda x: x[1])[0]\n",
    "print(f'Самый похожий пользователь: индекс {similat_user_index}, вектор {users_stats[similat_user_index]}')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
